/*
 * BottomPaneel.java
 *
 * Created on 29 februari 2008, 18:56
 */

package be.hogent.iii.project.gui;

import be.hogent.iii.project.client.netwerk.Connectie;
import be.hogent.iii.project.common.bericht.chat.ChatBericht;
import be.hogent.iii.project.common.game.objecten.Spel;
import com.thoughtworks.xstream.XStream;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.KeyStroke;


/**
 *
 * @author  Dieter Van der Stock
 */
public class BottomPaneel extends javax.swing.JPanel {
    
    private static final long serialVersionUID = 1L;
    private static final String PROPERTYFILE = "src\\be\\hogent\\iii\\project\\gui\\vakEigenschappen.properties";
    private Spel spel;
    private PaneelEventHandler handler;
    private Properties props;
    private Connectie connectie;
    private int huidigeSpelerID;
    private String huidigeSpelerNickname;
    
    /** Creates new form BottomPaneel */
    public BottomPaneel(Connectie connectie, PaneelEventHandler handler, Spel spel) {
        initComponents();
        this.connectie = connectie;
        this.handler = handler;
        this.spel = spel;
        this.huidigeSpelerID = spel.getHuidigeSpelerID();
        this.huidigeSpelerNickname = spel.getNickVanDeelnemer(huidigeSpelerID);
        this.labelEigenaar.setText(huidigeSpelerNickname);
        this.textAreaChat.setText("Welkom in het spel " + spel.getNaam());
        this.textAreaChat.append("\n-------------------------------------");
        this.props = loadProperties();
        //als er op enter wordt gedrukt, moet de chat verstuurd worden
        zetEnterAlsStuurChat();
    }
    
     /**
     * Lees properties file in. 
     * @return properties
     */
    private Properties loadProperties(){
        Properties property = new Properties();
        try {
            File file = new File(PROPERTYFILE);
            property.load(new FileInputStream(file));
        } //catch exception in case properties file does not exist
        catch (Exception e) {
            e.printStackTrace();
        }
        return property;
    }
    
    /**
     * Gaat het label in het bottomPaneel naar het juiste gif zetten en, indien nodig,
     * informatie geven over de eigenaarID van de entiteit.
     * @param typeVeld
     * @param eigenaarID De eigenaarID van de eventuele entiteit. Indien -1 betekent het dat er geen entiteiten
     * zijn op het geselecteerde vakje.
     */
    public void setSelectieLabel(String typeVeld, String typeVeldSimpel, int eigenaarID) {
        System.out.println("\n" + typeVeld + " voor selectionlabel met als eigenaar: " + eigenaarID);
        
        //het juiste icoon weergeven
        try {
            File bestand = new File(props.getProperty(typeVeld));
            labelTypeVeld.setIcon(new ImageIcon(ImageIO.read(bestand)));
            labelTypeVeld.setText(""); //mss aantal mannekes?
        } catch (Exception ex) {
            labelTypeVeld.setIcon(null);
            labelTypeVeld.setText("");
        }
        
        //zien of er barbaren, gebouwen ed zijn en zo ja, de juiste info ervan bepalen   
        String eigenaar;
        Color kleurFriendOrFoe;
        if (eigenaarID != -1) {
            //de eigenaar van de entiteit bepalen
            eigenaar = spel.getNickVanDeelnemer(eigenaarID);

            //Friend or Foe?
            if (eigenaarID == huidigeSpelerID) { 
                kleurFriendOrFoe = Color.GREEN;
            } else { 
                kleurFriendOrFoe = Color.RED;
            }
        } 
        else { //tis geen entiteit, gewoon gras of rots ofzo
            eigenaar = "";
            kleurFriendOrFoe = new Color(204,153,0); //donker-oranje
        }
        
        //veranderingen opslaan
        labelEigenaar.setForeground(kleurFriendOrFoe);
        labelEigenaar.setText(eigenaar);
        //labelTypeVeld.setText(typeVeldSimpel);
        labelTypeVeld.setBorder(new javax.swing.border.LineBorder(kleurFriendOrFoe, 3, true));
        
        //veranderingen doorvoeren
        labelTypeVeld.repaint();
        labelTypeVeld.revalidate();
        labelEigenaar.repaint();
        labelEigenaar.revalidate();
    }
    
    /**
     * Zal weergeven in ons bottompaneel of we aan de beurt zijn of niet
     * @param aanBeurt
     */
    public void geefBeurtWeer(boolean aanBeurt) {
        //gaat met een lichtje weergeven of de speler aan de beurt is
        if(aanBeurt) {
            buttonEindeBeurt.setText("Einde beurt");
            labelAanDeBeurt.setForeground(Color.green);
            //labelAanDeBeurt.setIcon(new javax.swing.ImageIcon(getClass().getResource("/be/hogent/iii/project/gui/images/greenlight.jpg")));
            labelAanDeBeurt.setText("Jouw beurt");
        }
        else {
            buttonEindeBeurt.setText("Wachten");
            labelAanDeBeurt.setForeground(Color.red);
            //labelAanDeBeurt.setIcon(new javax.swing.ImageIcon(getClass().getResource("/be/hogent/iii/project/gui/images/red light.jpg")));
            labelAanDeBeurt.setText("Niet aan de beurt");
        }
    }

    /**
     * Geeft de handler van deze paneel terug
     * @return
     */
    public PaneelEventHandler getHandler() {
        return handler;
    }

    /**
     * Zet den handler van dit paneel
     * @param handler
     */
    public void setHandler(PaneelEventHandler handler) {
        this.handler = handler;
    }
    
    /**
     * Zal chat toevoegen aan ons chatvenster dat we van anderen hebben gekregen
     * @param afzender
     * @param msg
     */
    public void setChatBericht(String afzender, String msg) {
        this.textAreaChat.append("\n<" + afzender + "> " + msg);
    }
    
    /**
     * Zal een chatbericht versturen dat we hebben ingetypt in het chatdeel
     * @param message
     */
    public void stuurChatBericht(String message){
        
        //even checken dat het bericht toch zeker niet leeg is
        if(!message.equals("")) {
            textFieldChat.setText("");
            XStream xStream = new XStream();
            ChatBericht chat;
            
            //is het een whisper?
            if(message.startsWith("/pm")) {
                //whitespace eraf doen aan beide kanten
                message = message.trim(); 
                //regex aanmaken om op te splitsen in whitespace
                Pattern p = Pattern.compile("[\\s]+");
                //de boodschap opsplitsen in "'/pm'-'nickname'-'boodschap'"
                String[] result = p.split(message,3);
                //het chatbericht aanmaken
                chat = new ChatBericht(huidigeSpelerNickname, result[2], result[1], true);
                //onszelf laten zien naar wie we wat gewhisperd hebben
                textAreaChat.append("\n->" + result[1] + ": " + result[2]);
            } 
            //zoniet, dan is het een bericht naar iedereen in het spel
            else {
                chat = new ChatBericht(huidigeSpelerNickname, message, spel.getId(), false);
            }
            //uiteindelijk versturen we ons bericht naar de server
            connectie.stuurBericht(xStream.toXML(chat));
        }
    }
    
    /**
     * Zal enter als default knop voor den chat zetten, zoda we kunnen sturen met 'enter' te drukken
     */
    private void zetEnterAlsStuurChat() {
        textFieldChat.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),"chat");
        textFieldChat.getActionMap().put("chat", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                stuurChatBericht(textFieldChat.getText());
            }
        });
    }
    
    /**
     * Geeft het spel terug waar we toe behoren
     * @return
     */
    public Spel getSpel(){
        return spel;
    }

    /**
     * Zet het spel waartoe deze bottompaneel behoort.
     * @param spel
     */
    public void setSpel(Spel spel){
        this.spel = spel;
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonEindeBeurt = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        textAreaChat = new javax.swing.JTextArea();
        labelTypeVeld = new javax.swing.JLabel();
        labelEigenaar = new javax.swing.JLabel();
        textFieldChat = new javax.swing.JTextField();
        buttonStuurChat = new javax.swing.JButton();
        labelAanDeBeurt = new javax.swing.JLabel();

        setBackground(new java.awt.Color(0, 0, 0));

        buttonEindeBeurt.setBackground(new java.awt.Color(102, 0, 0));
        buttonEindeBeurt.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        buttonEindeBeurt.setForeground(new java.awt.Color(204, 153, 0));
        buttonEindeBeurt.setText("Einde beurt");
        buttonEindeBeurt.setName("eindeBeurt"); // NOI18N
        buttonEindeBeurt.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonEindeBeurtActionPerformed(evt);
            }
        });

        textAreaChat.setBackground(new java.awt.Color(102, 0, 0));
        textAreaChat.setColumns(20);
        textAreaChat.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        textAreaChat.setForeground(new java.awt.Color(204, 153, 0));
        textAreaChat.setRows(5);
        jScrollPane2.setViewportView(textAreaChat);

        labelTypeVeld.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelTypeVeld.setForeground(new java.awt.Color(204, 153, 0));
        labelTypeVeld.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        labelTypeVeld.setIcon(new javax.swing.ImageIcon(getClass().getResource("/be/hogent/iii/project/gui/images/gras.jpg"))); // NOI18N
        labelTypeVeld.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 153, 0), 3));
        labelTypeVeld.setIconTextGap(10);

        labelEigenaar.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelEigenaar.setForeground(new java.awt.Color(204, 153, 0));
        labelEigenaar.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        labelEigenaar.setText("Eigenaar");

        textFieldChat.setBackground(new java.awt.Color(102, 0, 0));
        textFieldChat.setFont(new java.awt.Font("Tahoma", 1, 11));
        textFieldChat.setForeground(new java.awt.Color(204, 153, 0));
        textFieldChat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textFieldChatActionPerformed(evt);
            }
        });

        buttonStuurChat.setBackground(new java.awt.Color(102, 0, 0));
        buttonStuurChat.setForeground(new java.awt.Color(204, 153, 0));
        buttonStuurChat.setText("Verstuur");
        buttonStuurChat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonStuurChatActionPerformed(evt);
            }
        });

        labelAanDeBeurt.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelAanDeBeurt.setForeground(new java.awt.Color(255, 0, 0));
        labelAanDeBeurt.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        labelAanDeBeurt.setText("Niet aan de beurt");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(labelEigenaar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelTypeVeld, javax.swing.GroupLayout.DEFAULT_SIZE, 142, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(textFieldChat)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(buttonStuurChat))
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 374, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(labelAanDeBeurt, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(buttonEindeBeurt, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(labelAanDeBeurt, javax.swing.GroupLayout.DEFAULT_SIZE, 32, Short.MAX_VALUE)
                        .addGap(3, 3, 3)
                        .addComponent(buttonEindeBeurt, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(labelTypeVeld, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(textFieldChat, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE)
                                .addComponent(labelEigenaar, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(buttonStuurChat, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void buttonEindeBeurtActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonEindeBeurtActionPerformed
        if (handler.isAanBeurt())
            SpelFrame.getSpelFrame().eindeBeurt();
        //handler.beginBeurt();
}//GEN-LAST:event_buttonEindeBeurtActionPerformed

    private void buttonStuurChatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStuurChatActionPerformed
        stuurChatBericht(textFieldChat.getText());
}//GEN-LAST:event_buttonStuurChatActionPerformed

    private void textFieldChatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textFieldChatActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_textFieldChatActionPerformed
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton buttonEindeBeurt;
    private javax.swing.JButton buttonStuurChat;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel labelAanDeBeurt;
    private javax.swing.JLabel labelEigenaar;
    private javax.swing.JLabel labelTypeVeld;
    private javax.swing.JTextArea textAreaChat;
    private javax.swing.JTextField textFieldChat;
    // End of variables declaration//GEN-END:variables

    
    
    
    
}
